geom_type verrät, welche Geometrie OCCT einem Element intern zuordnet:
| Element | geom_type |
charakteristische Größe |
|---|---|---|
| Kreiskante (Deckel/Boden) | CIRCLE |
Radius, Mittelpunkt |
| Nahtkante (Mantellinie) | LINE |
Richtungsvektor |
| Mantelfläche | CYLINDER |
Achse, Radius |
| Deckel-/Bodenfläche | PLANE |
Normalenvektor, Ursprung |
zyl = bd.Cylinder(radius=10, height=20)
for e in zyl.edges():
print(e.geom_type, round(e.length, 2))
# → CIRCLE 62.83 / CIRCLE 62.83 / LINE 20.0
Wie lässt sich ein geometrisches Objekt mathematisch beschreiben?
| Form | Kreis (Beispiel) | Problem |
|---|---|---|
| Explizit | mehrwertig; versagt bei senkrechter Tangente | |
| Implizit | schwer auszuwerten; kein natürlicher Startpunkt | |
| Parametrisch | universell, eindeutig auswertbar |
CAD-Systeme verwenden ausschließlich die parametrische Darstellung – für Kurven und Flächen.
Eine Kurve im 3D-Raum als Funktion eines Parameters
Abgeleitete Größen:
Tangentenvektor:
Richtung und „Geschwindigkeit" entlang der Kurve
Krümmung:
Wie stark biegt die Kurve? Kehrwert des Krümmungsradius.
u: 0.0 0.25 0.5 0.75 1.0
●─────────●─────────●─────────●─────────●
C(0) C(½) C(1)
In build123d: position_at(t) mit tangent_at(t) den Tangentenvektor.
Flächen sind Funktionen von zwei Parametern
Der Normalenvektor ergibt sich aus den Tangenten in
→ Vorzeichen bestimmt, welche Seite „außen" ist (erinnert an Orientierung aus VL2)
Die Flächentypen (Ebene, Zylinder, NURBS-Flächen, …) sind Thema von Vorlesung 4.
Drei Grundobjekte für die Arbeit im Raum:
| Klasse | Bedeutung | Beispiel |
|---|---|---|
Vector |
Punkt oder freier Vektor | Vector(1, 2, 3) |
Axis |
Ursprung + Richtung (Achse) | Axis((0,0,0), (0,0,1)) |
Plane |
Ebene: Ursprung + Orientierung | Plane.XY |
Auf Vector sind die üblichen Operationen definiert: Addition, Skalierung, Länge (v.length), Normierung, Skalarprodukt (v.dot(w)), Kreuzprodukt (v.cross(w)).
Vordefinierte Achsen: Axis.X, Axis.Y, Axis.Z (Weltkoordinatensystem)
Vordefinierte Ebenen:
| Ebene | Normalenrichtung | Verwendung |
|---|---|---|
Plane.XY |
Standard-Skizzierebene | |
Plane.XZ |
Frontansicht | |
Plane.YZ |
Seitenansicht |
Benutzerdefiniert:
Axis((5, 3, 0), (0, 0, 1)) – Achse durch beliebigen PunktPlane(origin=(0,0,10), z_dir=(1,0,0)) – Ebene mit beliebiger NormalenJedes Objekt hat eine Location – seine Position und Orientierung im Weltkoordinatensystem.
Eine Location kodiert:
Location ist das lokale Koordinatensystem eines Objekts relativ zur Welt.
Kann aus einem Punkt (Location((20, 10, 5))) oder aus einer Ebene (Location(Plane.XZ)) erzeugt werden.
| Operation | Methode |
|---|---|
| Verschiebung | obj.move(Location((dx, dy, dz))) |
| Drehung | obj.rotate(Axis.Z, winkel_grad) |
| Spiegelung | obj.mirror(Plane.XZ) |
| Skalierung | obj.scale(faktor) |
Wichtig: Jede Transformation liefert ein neues Objekt – das Original bleibt unverändert.
Transformationen lassen sich verketten:
zyl.rotate(Axis.Z, 30).move(Location((20, 0, 0)))
Eine Drehung im 3D-Raum ist durch Achse + Winkel vollständig beschrieben:
Intern wird daraus eine Rotationsmatrix
# Drehung um die Z-Achse, 45°
zyl.rotate(Axis.Z, 45)
# Drehung um eine beliebige Achse durch Punkt (5, 0, 0)
zyl.rotate(Axis((5, 0, 0), (0, 0, 1)), 30)
Translationen kommutieren – die Reihenfolge ist egal:
Rotationen kommutieren nicht – die Reihenfolge ist entscheidend:
Rotation + Translation kommutieren ebenfalls nicht:
→ Bei verketteten Transformationen immer auf die Reihenfolge achten.
Ein besonders nützliches Muster: Konstruktionsebene direkt aus einer vorhandenen Fläche ableiten.
ebene = Plane(oberseite) # Ursprung + Orientierung der Fläche
Die Ebene übernimmt automatisch den Flächenmittelpunkt als Ursprung und die Flächennormale als
Anwendung: Bohrung senkrecht auf einer schrägen Fläche – die Skizze wird auf der Fläche platziert, unabhängig von deren Lage im Raum.
Exakt durch eine geschlossene Formel beschreibbar:
| Typ | geom_type |
Vorkommen | |
|---|---|---|---|
| Linie | LINE |
Kanten eines Quaders | |
| Kreis | CIRCLE |
Kanten eines Zylinders | |
| Ellipse | wie Kreis, aber |
ELLIPSE |
Kegelschnitte |
Für Standardkörper (Box, Cylinder, Sphere, …) reichen analytische Kurven vollständig aus.
Die Krümmung
Die Krümmungsverteilung entscheidet, wie geometrische Operationen (Versatz, Abrundung, Sweep) auf eine Kurve wirken.
An den vier Scheitelpunkten:
| Stelle | ||
|---|---|---|
| Ende der großen Halbachse ( |
||
| Ende der kleinen Halbachse ( |
→ Die Ellipse hat keine konstante Krümmung – im Gegensatz zum Kreis.
Eine Versatzkurve entsteht, indem jeder Punkt der Originalkurve um eine konstante Distanz
Typische CAD-Anwendungen:
Kreis (Radius
Grund: Konstante Krümmung → Normalen drehen gleichmäßig → Versatz ändert nur den Radius.
Ellipse (
Die Versatzkurve lässt sich nicht als
ellipse = bd.Edge.make_ellipse(x_radius=30, y_radius=15)
offset = ellipse.offset_2d(5)
for e in offset.edges():
print(e.geom_type) # → OFFSET
OCCT berechnet den Versatz numerisch als Offset-Kurve – keine analytische Ellipse mehr.
Bei konstanter Krümmung (Kreis) wirkt der Versatz überall gleich.
Bei variabler Krümmung (Ellipse) wirkt er ungleichmäßig:
Geometrische Operationen erzeugen häufig Kurven höherer Komplexität als die Eingabe —
selbst bei einfachen Ausgangskurven.
Daher brauchen CAD-Systeme eine Darstellung, die beliebige glatte Kurven beschreiben kann.
Edge trägt eine Kurve Face trägt eine Fläche Vector, Axis, Plane, Location – räumliches Handwerkszeug; Transformationen erzeugen neue Objekte